package cn.xfdzx.android.apps.shop.view;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;

import cn.xfdzx.android.apps.shop.contract.ScrollClickListener;

/**
 * @author gzk
 * @date 2020/9/2 0002
 * description：
 */
public class MyScrollView extends ScrollView {

    private View inner;
    private float y;
    private Rect normal = new Rect();

    private static final int MAX_OVERSCROLL_Y = 40;
    private int newMaxOverScrollY;
    private int totalHeight;
    private ScrollClickListener scrollClickListener;
    public MyScrollView(Context context) {
        super(context);
        init(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    private void init(Context context) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        float density = metrics.density;
        newMaxOverScrollY = (int) (density * MAX_OVERSCROLL_Y);

    }
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        if (getChildCount() > 0) {
            inner = getChildAt(0);

        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (inner == null) {
            return super.onTouchEvent(ev);
        } else {
            commOnTouchEvent(ev);
        }
        return super.onTouchEvent(ev);
    }

    public  boolean isSwitch=false;
    public void commOnTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.e("ACTION_DOWN","ACTION_DOWN");
                isSwitch=false;
                y = ev.getY();
                totalHeight=   newMaxOverScrollY+inner.getBottom();

                break;
            case MotionEvent.ACTION_UP:
                if (isNeedAnimation()) {
                    // Log.v("mlguitar", "will up and animation");
                    animation();
                }
                if (isSwitch) {
                    scrollClickListener.onScrollClick();
                }

                break;
            case MotionEvent.ACTION_MOVE:
                final float preY = y;
                float nowY = ev.getY();

                /**
                 * size=4 表示 拖动的距离为屏幕的高度的1/4
                 */
                int deltaY = (int) (preY - nowY) ;

//向下拉
                if (deltaY<0) {
                    // 滚动
                    // scrollBy(0, deltaY);
                    y = nowY;
                    // 当滚动到最上或者最下时就不会再滚动。这时移动布局
                    if (isNeedMove()) {
                        if (normal.isEmpty()) {
                            // 保存正常的布局位置
                            normal.set(inner.getLeft(), inner.getTop(),
                                    inner.getRight(), inner.getBottom());
                            return;
                        }
                        int yy = inner.getTop() - deltaY;



                        if (inner.getBottom() < totalHeight) {

                            // 移动布局
                            inner.layout(inner.getLeft(), yy, inner.getRight(),
                                    inner.getBottom() - deltaY);
                        } else {
                            isSwitch = true;
                        }
                    }
                }
                break;
            default:
                break;
        }
    }

    // 开启动画移动

    public void animation() {
        // 开启移动动画
        TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
                normal.top);
        ta.setDuration(200);
        inner.startAnimation(ta);
        // 设置回到正常的布局位置
        inner.layout(normal.left, normal.top, normal.right, normal.bottom);
        normal.setEmpty();
    }

    // 是否须要开启动画
    public boolean isNeedAnimation() {
        return !normal.isEmpty();
    }

    // 是否须要移动布局
    public boolean isNeedMove() {
        int offset = inner.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        if (scrollY == 0 || scrollY == offset) {
            return true;
        }
        return false;
    }



    public void setOnScrollClickListener(ScrollClickListener itemClickListener) {
        this.scrollClickListener = itemClickListener;

    }
}
